﻿Imports System.IO
Imports Microsoft.Win32


Public Class Form1

#Region "data"
    Private srcFolder As String
    Private destFolder As String
    Private winversion As String
    Private is64Bit As Boolean
    Private picturePathOld As String
    Private videoPathOld As String
    Private docPathOld As String
    Private musicPathOld As String
    Private picturePathNew As String
    Private videoPathNew As String
    Private docPathNew As String
    Private musicPathNew As String
    Private dlPathOld As String
    Private dlPathNew As String
    Private userPathOld As String
    Private userPathNew As String
    Private regKey As RegistryKey
    Private sysdriveInfo As DriveInfo
    Private sysdriveSizeGB As Double
    Private isHiberOn As Boolean
    Private pagefileSize As Double
    Private binSize As Integer
    Private drives() As String
    Private Declare Function ShellExecute Lib "shell32.dll" _
        Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal _
        lpOperation As String, ByVal lpFile As String, ByVal _
        lpParameters As String, ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long


#End Region

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        winversion = My.Computer.Info.OSVersion
        is64Bit = System.Environment.Is64BitOperatingSystem
        Try
            sysdriveInfo = New DriveInfo(Environment.GetEnvironmentVariable("systemdrive"))
            sysdriveSizeGB = (((sysdriveInfo.TotalSize / 1024) / 1024) / 1024)
            sysdriveSizeGB = Math.Round(sysdriveSizeGB, 2, MidpointRounding.AwayFromZero)
        Catch ex As Exception

        End Try
        Try
            If CDbl(winversion) > 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders")
            ElseIf CDbl(winversion) < 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
            End If

            Dim temp As String  ' Zwischenspeicher der Registry-Werte, um den Pfad anzupassen und dann der jeweiligen Variable zuzuweisen
            temp = regKey.GetValue("My Pictures").ToString
            temp.Replace("USERPROFILE", Environment.GetEnvironmentVariable("USERPROFILE"))  ' Umgebungsvariable durch echten Pfad ersetzen
            picturePathOld = temp
            temp = regKey.GetValue("My Video").ToString : temp.Replace("USERPROFILE", Environment.GetEnvironmentVariable("USERPROFILE"))
            videoPathOld = temp
            temp = regKey.GetValue("Personal").ToString : temp.Replace("USERPROFILE", Environment.GetEnvironmentVariable("USERPROFILE"))
            docPathOld = temp
            temp = regKey.GetValue("My Music").ToString : temp.Replace("USERPROFILE", Environment.GetEnvironmentVariable("USERPROFILE"))
            musicPathOld = temp
            regKey.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


        Try ' Check if Hibernation is Enabled
            regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Power", True)

            If regKey.GetValue("HibernateEnabled").ToString = "00000001" Then
                isHiberOn = True
                RadioButton1.Checked = True
                RadioButton2.Checked = False
            ElseIf regKey.GetValue("HibernateEnabled").ToString = "00000000" Then
                isHiberOn = False
                RadioButton2.Checked = True
                RadioButton1.Checked = False
            Else
                If File.Exists(Environment.GetEnvironmentVariable("SYSTEMDRIVE") + "\" + "hiberfil.sys") Then
                    RadioButton1.Checked = True
                    RadioButton2.Checked = False
                Else
                    RadioButton1.Checked = False
                    RadioButton2.Checked = False
                End If
            End If

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            regKey.Close()
        End Try

        Try
            Dim pfInfo As New FileInfo(Environment.GetEnvironmentVariable("SYSTEMDRIVE") + "\" + "pagefile.sys")
            pagefileSize = ((pfInfo.Length / 1024) / 1024)
            pagefileSize = Math.Round(pagefileSize, 2)
        Catch ex As Exception

        End Try

        Try
            regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer")
            binSize = CInt(regKey.GetValue("RecycleBinSize", 101))

        Catch ex As Exception

        End Try

        Try ' Pfad des Download Ordners auslesen
            regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", False)
            dlPathOld = regKey.GetValue("{374DE290-123F-4565-9164-39C4925E467B}").ToString
            regKey.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        If dlPathOld = vbNullString Then    ' Wenn im obigen Pfad nichts gefunden wurde
            If Directory.Exists(Environment.GetEnvironmentVariable("USERPROFILE") + "\Downloads") Then
                dlPathOld = Environment.GetEnvironmentVariable("USERPROFILE") + "\Downloads" : End If
        End If

        userPathOld = Environment.GetEnvironmentVariable("USERPROFILE")

        Try  ' Größe Pagefile auslesen
            pagefileSize = CDbl(My.Computer.FileSystem.GetFileInfo(System.Environment.GetEnvironmentVariable("SYSTEMDRIVE") + "\" + "pagefile.sys").Length)
            pagefileSize = ((pagefileSize / 1024) / 1024)
            TextBox3.Text = pagefileSize.ToString
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


       

        DrivesToListView()

        ' Ausgelesene Inhalte zuweisen
        TextBox11.Text = dlPathOld : TextBox16.Text = userPathOld : TextBox3.Text = picturePathOld
        TextBox5.Text = musicPathOld : TextBox7.Text = docPathOld : TextBox9.Text = videoPathOld
        TextBox13.Text = pagefileSize.ToString : If binSize <> 101 Then TextBox15.Text = binSize.ToString

    End Sub

#Region "ButtonClicks"

    'Durchsuchen 1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = False
            .Description = "Wählen sie einen Ordner aus, den sie auf eine andere Partition/Festplatte verschieben möchten"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then  ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            srcFolder = folderdialog.SelectedPath
            TextBox1.Text = srcFolder

        End If
    End Sub

    'Durchsuchen 2
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            destFolder = folderdialog.SelectedPath
            TextBox2.Text = destFolder
        End If
    End Sub

    'Verschieben
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        srcFolder = TextBox1.Text : destFolder = TextBox2.Text
        If srcFolder <> vbNullString And destFolder <> vbNullString Then    ' Nur wenn zwei Ordner eingegeben oder ausgewählt wurden
            If Not Directory.Exists(destFolder) Then  ' Zielpfad erstellen, wenn nicht vorhanden
                Try
                    Directory.CreateDirectory(destFolder)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
            If Directory.GetFiles(destFolder).Count > 0 Then
                MsgBox("Der angegebene Ziel-Ordner enthält Dateien. Bitte löschen sie die Dateien oder wählen einen anderen (leeren) Ordner aus.)")
            End If
            Dim thread As New Threading.Thread(AddressOf copyNlink)
            thread.Start()
        End If

    End Sub

    Private Sub copyNlink()
        Try
            Dim stringList As List(Of String) = RunningApps(srcFolder)       ' Liste der laufenden Anwendungen speichern
            If stringList.Count <> 0 Then ' Es gibt Anwendungen die ausgeführt werden
                For Each exe As String In stringList
                    exe = exe & ".exe"
                Next
                Dim message As String = String.Join(Environment.NewLine, stringList)
                MsgBox("Folgende Prozesse laufen im ersten Ordner und müssen erst beendet werden: (Beenden via Taskmanager)" + Environment.NewLine + message)
                Exit Sub
            End If
            My.Computer.FileSystem.CopyDirectory(srcFolder, destFolder, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
            My.Computer.FileSystem.DeleteDirectory(srcFolder, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)
            mklink(srcFolder, destFolder) ' Verknüpfung erstellen
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Benutzerpfad ändern
    Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click

        If TextBox16.Text <> vbNullString And TextBox17.Text <> vbNullString And TextBox17.Text <> TextBox8.Text Then
            userPathOld = TextBox16.Text : userPathNew = TextBox17.Text

            Dim thread As New Threading.Thread(AddressOf copyUserPath)
            thread.Start()
        Else
            MsgBox("Tragen sie zwei valide, unterschiedliche Pfade ein")
        End If

    End Sub

    Private Sub copyUserPath()
        Try
            My.Computer.FileSystem.CopyDirectory(userPathOld, userPathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
            My.Computer.FileSystem.DeleteDirectory(userPathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
            mklink(userPathOld, userPathNew)
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Bilder verschieben
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

        If TextBox3.Text <> vbNullString And TextBox4.Text <> vbNullString And TextBox3.Text <> TextBox4.Text Then ' Zwei Pfade müssen angegeben werden und dürfen nicht gleich sein
            picturePathNew = TextBox4.Text : picturePathOld = TextBox3.Text
            Try

                My.Computer.FileSystem.CopyDirectory(picturePathOld, picturePathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
                My.Computer.FileSystem.DeleteDirectory(picturePathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", True)
                regKey.SetValue("My Pictures", picturePathNew)
                regKey.Close()
                mklink(picturePathOld, picturePathNew)
                MsgBox("Erfolg!")
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        Else
            MsgBox("Bitten tragen sie zwei valide, unterschiedliche Pfade ein")
        End If
    End Sub

    'Musik verschieben
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

        If TextBox5.Text <> vbNullString And TextBox6.Text <> vbNullString And TextBox5.Text <> TextBox6.Text Then

            musicPathNew = TextBox6.Text : musicPathOld = TextBox5.Text

            If Not Directory.Exists(musicPathNew) Then
                Directory.CreateDirectory(musicPathNew)
            End If
            Dim thread As New Threading.Thread(AddressOf copyMusicPath)
            If Not thread.IsAlive Then
                thread.Start()
            End If

        Else
            MsgBox("Bitte tragen sie zwei valide, unterschiedliche Pfade ein.")
        End If
    End Sub

    Private Sub copyMusicPath()
        Try

            My.Computer.FileSystem.CopyDirectory(musicPathOld, musicPathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
            My.Computer.FileSystem.DeleteDirectory(musicPathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)

            If CDbl(winversion) > 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", True)
            ElseIf CDbl(winversion) < 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", True)
            End If
            regKey.SetValue("My Music", musicPathNew)
            regKey.Close()
            mklink(musicPathOld, musicPathNew)
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Dokumente verschieben
    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        If TextBox7.Text <> vbNullString And TextBox8.Text <> vbNullString And TextBox7.Text <> TextBox8.Text Then

            docPathNew = TextBox8.Text : docPathOld = TextBox7.Text
            If Not Directory.Exists(docPathNew) Then
                Directory.CreateDirectory(docPathNew)
            End If
            Dim thread As New Threading.Thread(AddressOf copyDocPath)
            If Not thread.IsAlive Then
                thread.Start()
            End If
        Else
            MsgBox("Bitte tragen sie zwei valide, unterschiedliche Pfade ein.")
        End If
    End Sub

    Private Sub copyDocPath()
        Try
            My.Computer.FileSystem.CopyDirectory(docPathOld, docPathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
            My.Computer.FileSystem.DeleteDirectory(docPathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)

            If CDbl(winversion) > 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders", True)
            ElseIf CDbl(winversion) < 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", True)
            End If
            regKey.SetValue("Personal", docPathNew)
            regKey.Close()
            mklink(docPathOld, docPathNew)
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Videos verschieben
    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click

        If TextBox9.Text <> vbNullString And TextBox10.Text <> vbNullString Then
            videoPathNew = TextBox4.Text : videoPathOld = TextBox5.Text

            If Not Directory.Exists(videoPathNew) Then
                Try
                    Directory.CreateDirectory(videoPathNew)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If

            Dim thread As New Threading.Thread(AddressOf copyVideoPath)
            If Not thread.IsAlive Then
                thread.Start()
            End If

        Else
            MsgBox("Bitte tragen sie zwei valide, unterschiedliche Pfade ein.")
        End If
    End Sub

    Private Sub copyVideoPath()
        Try
            My.Computer.FileSystem.CopyDirectory(videoPathOld, videoPathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
            My.Computer.FileSystem.DeleteDirectory(videoPathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)

            If CDbl(winversion) > 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders")
            ElseIf CDbl(winversion) < 6 Then
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
            End If
            regKey.SetValue("My Video", videoPathNew)
            regKey.Close()
            mklink(videoPathOld, videoPathNew)
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Downloads verschieben
    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
        dlPathNew = TextBox12.Text : dlPathOld = TextBox11.Text

        If dlPathNew <> vbNullString And dlPathOld <> vbNullString And dlPathNew <> dlPathOld Then    ' Nur wenn zwei Ordner eingegeben oder ausgewählt wurden
            If Not Directory.Exists(dlPathNew) Then
                Directory.CreateDirectory(dlPathNew)
            End If
            Dim thread As New Threading.Thread(AddressOf copyDlPAth)
            If Not thread.IsAlive Then
                thread.Start()
            End If
        Else
            MsgBox("Bitte geben sie zwei valide, unterschiedliche Pfade an.")
        End If
    End Sub

    Private Sub copyDlPAth()
        Try
            My.Computer.FileSystem.CopyDirectory(dlPathOld, dlPathNew, FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)  ' Erst Ordner an neuen Ort kopieren
            My.Computer.FileSystem.DeleteDirectory(dlPathOld, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) ' Ausgangsordner löschen mit allen Inhalten, aber im Papierkorb behalten (falls ordner.size < papierkorb.maxsize - papierkorb.size)
            mklink(dlPathOld, dlPathNew) ' Verknüpfung erstellen
            regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Internet Explorer", True)
            regKey.SetValue("Download Directory", dlPathNew)
            regKey.Close()
            regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", True)
            regKey.SetValue("{374DE290-123F-4565-9164-39C4925E467B}", dlPathNew)
            regKey.Close()
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Pagefile ändern
    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
        Try
            regKey = Registry.LocalMachine.OpenSubKey("System\CurrentControlSet\Control\Session Manager\Memory Management", True)
            regKey.SetValue("PagingFiles", System.Environment.GetEnvironmentVariable("SYSTEMDRIVE") + "\" + "pagefile.sys " + TextBox13.Text + " " + TextBox13.Text)
            regKey.Close()
            MsgBox("Erfolg!")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    'Hiberfile ändern
    Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        If RadioButton1.Checked = True Then
            regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Power", True)
            regKey.SetValue("HibernateEnabled", "00000001", RegistryValueKind.DWord) 'Enable
            regKey.Close()
        Else
            regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Power", True)
            regKey.SetValue("HibernateEnabled", "00000000", RegistryValueKind.DWord) 'Disable
            regKey.Close()
        End If
    End Sub

    'Pfad für Bilder suchen
    Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners und der Dateien aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            picturePathNew = folderdialog.SelectedPath
            TextBox4.Text = picturePathNew
        End If
    End Sub

    'Pfad für Musik suchen
    Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            musicPathNew = folderdialog.SelectedPath
            TextBox6.Text = musicPathNew
        End If
    End Sub

    'Pfad für Dokumente suchen
    Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            docPathNew = folderdialog.SelectedPath
            TextBox8.Text = docPathNew
        End If
    End Sub

    'Pfad für Videos suchen
    Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            videoPathNew = folderdialog.SelectedPath
            TextBox10.Text = videoPathNew
        End If
    End Sub

    'Größe Papierkorb ändern
    Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click
        If 0 <= CInt(TextBox15.Text) And CInt(TextBox15.Text) <= 100 Then
            Try
                regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", True)
                regKey.SetValue("RecycleBinSize", CInt(TextBox15.Text), RegistryValueKind.DWord)
                MsgBox("Erfolgreich geändert.")
                regKey.Close()
            Catch
                MsgBox("Fehlgeschlagen, Wenden sie sich an den Entwickler")
            End Try

        Else
            MsgBox("Bitte nur ganze Zahlen zwischen einschließlich 0 und 100 eingeben!")
        End If
    End Sub

    'Benutzerpfad suchen
    Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            userPathNew = folderdialog.SelectedPath
            TextBox17.Text = userPathNew
        End If
    End Sub

#Region "Hilfe"
    'Eigene Bilder Hilfe
    Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click
        MsgBox("Im Ordner Eigene Bilder können sich im Laufe der Zeit große Datenmengen sammeln. Deshalb ist es bei einer kleinen Systempartition sinnvoll, diese Daten auszulagern")
    End Sub

    'Eigene Musik Hilfe
    Private Sub Button19_Click(sender As Object, e As EventArgs) Handles Button19.Click
        MsgBox("Im Ordner Eigene Musik können sich im Laufe der Zeit große Datenmengen sammeln. Deshalb ist es bei einer kleinen Systempartition sinnvoll, diese Daten auszulagern")
    End Sub

    'Eigene Dokumente Hilfe
    Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Button20.Click
        MsgBox("Im Ordner Eigene Dokumente können sich im Laufe der Zeit große Datenmengen sammeln. Deshalb ist es bei einer kleinen Systempartition sinnvoll, diese Daten auszulagern")
    End Sub

    'Eigene Videos Hilfe
    Private Sub Button21_Click(sender As Object, e As EventArgs) Handles Button21.Click
        MsgBox("Im Ordner Eigene Videos können sich im Laufe der Zeit große Datenmengen sammeln. Deshalb ist es bei einer kleinen Systempartition sinnvoll, diese Daten auszulagern")

    End Sub

    'Downloads Hilfe
    Private Sub Button22_Click(sender As Object, e As EventArgs) Handles Button22.Click
        MsgBox("Im Downloadordner können sich im Laufe der Zeit große Datenmengen sammeln. Deshalb ist es bei einer kleinen Systempartition sinnvoll, diese Daten auszulagern")

    End Sub

    'Pagefile Hilfe
    Private Sub Button23_Click(sender As Object, e As EventArgs) Handles Button23.Click
        MsgBox("Die Auslagerungsdatei (engl. swap file oder page file) bezeichnet eine Datei auf einem Massenspeichermedium eines Computers, die verschiedene Betriebssysteme im Rahmen ihrer Speicherverwaltung verwenden, um Prozessen einen größeren Adressraum zur Verfügung stellen zu können als durch den physisch vorhandenen Arbeitsspeicher eigentlich möglich wäre. Man kann die Auslagerungsdatei auch als virtuellen Arbeitsspeicher bezeichnen." _
               + Environment.NewLine + "Bei sehr großem realen Arbeitsspeicher, kann die Auslagerungsdatei eher klein eingestellt werden. Unter einem halben Gigabyte (512 MB) sollte man dabei nicht gehen, da einige Programme immer ein bisschen abhängig davon sind." _
               + Environment.NewLine + "Hat man eher wenig Arbeitsspeicher (< 4GB) und genug Speicherplatz auf der Festplatte, ist das 1 1/2 fache der Arbeitsspeichergröße ein guter Richtwert.")
    End Sub

    'Hiberfile Hilfe
    Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click
        MsgBox("Der Ruhezustand, auch Hibernation (englisch wörtlich für 'Winterschlaf') oder Suspend-to-Disk (vom englischen für 'Auslagern auf Festplatte') genannt, sind zwei Teile einer Energiesparfunktion moderner Rechner (wie beispielsweise PCs) und wird insbesondere bei Notebooks verwendet, weil dort die Einsparung von Strom für den Betrieb ohne Netz am wichtigsten ist, um die Akku-Laufzeit zu erhöhen. Um diesen Modus auszuführen wird auf der Festplatte eine Datei reserviert (Hiberfil.sys) in welche die aktuell verwendeten Daten des PCs gesichert werden und der Computer dann ansonsten ausgeschaltet werden kann. Beim nächsten Start werden diese Daten wieder geladen und der Nutzer kann genau an der Stelle weitermachen, an der er aufgehört hat. " + Environment.NewLine _
                + "Jedoch braucht diese Datei (hiberfil.sys) ungefähr genauso viel Platz, wie der Arbeitsspeicher groß ist. Bei Konfigurationen mit sehr viel Arbeitsspeicher wird somit viel Speicherplatz verbraucht. Benötigt man den Ruhezustand nicht und ist auf Speicherplatz angewiesen, kann man diesen getrost deaktivieren.)")
    End Sub

    'Papierkorb Hilfe
    Private Sub Button25_Click(sender As Object, e As EventArgs) Handles Button25.Click
        MsgBox("Für den Papierkorb werden Teile der Festplatte reserviert. Hat man wenig Speicherplatz zur Verfügung und / oder möchte Objekte direkt löschen, lohnt es sich den reservierten Speicherplatz zu verkleinern oder auf 0 zu setzen.")
    End Sub

    'Aktueller Benutzer Hilfe
    Private Sub Button26_Click(sender As Object, e As EventArgs) Handles Button26.Click
        MsgBox("Im Benutzerpfad befinden sich viele benutzerspezifische Daten. Außerdem liegen dort auch die Eigene Dateien-Ordner. Das Verschieben dieses Ordners erspart einem das Verschieben der einzelnen Ordner.")
    End Sub

#End Region

    'Download Pfad suchen
    Private Sub Button27_Click(sender As Object, e As EventArgs) Handles Button27.Click
        Dim folderdialog As New FolderBrowserDialog
        With folderdialog
            .RootFolder = Environment.SpecialFolder.MyComputer
            .ShowNewFolderButton = True
            .Description = "Wählen sie den neuen Speicherort ihres Ordners aus"
            .ShowDialog()
        End With
        If folderdialog.SelectedPath <> vbNullString Then   ' Falls die Auswahl abgebrochen wird, kann keine Auswahl übergeben werden
            dlPathNew = folderdialog.SelectedPath
            TextBox12.Text = dlPathNew
        End If
    End Sub

    'Hilfstextf
    Private Sub Button28_Click(sender As Object, e As EventArgs) Handles Button28.Click
        MsgBox("Diese Funktion kopiert einen Ordner (bspw. einen Programmordner) an einen neuen Ort und verknüpft den neuen Speicherort mit dem alten Speicherort, sodass das System denkt, dass die Daten immer noch am selben Ort wären. Dadurch lässt sich Speicherplatz umorganisieren um bspw. Platz auf SSDs zu schaffen.")
    End Sub

    'Mail to Developer
    Private Sub Button29_Click(sender As Object, e As EventArgs) Handles Button29.Click
        System.Diagnostics.Process.Start("mailto:webmaster@supture.com?Subject=Feedback zu StorageOrizer")
    End Sub

#End Region

    ' Eintrag bei Papierkorb %
    Private Sub TextBox15_TextChanged(sender As Object, e As EventArgs) Handles TextBox15.TextChanged   ' Eingabe von einer Prozentangabe
        If TextBox15.Text <> vbNullString Then
            Try
                Dim tmp As Double
                tmp = CDbl(TextBox15.Text)
                tmp = tmp / 100
                tmp = tmp * sysdriveSizeGB
                tmp = Math.Round(tmp, 2, MidpointRounding.AwayFromZero)
                Label20.Text = "entspricht: " + tmp.ToString + " GB vom Gesamtspeicher"
                Label20.TextAlign = ContentAlignment.MiddleCenter
            Catch ex As Exception

            End Try
        End If

    End Sub

#Region "Functions"

    Private Sub DrivesToListView()
        Dim objItem As ListViewItem
        Dim intWidth = ListView1.Width - 4
        ListView1.View = View.Details
        ListView1.Columns.Add("Partition", CInt(intWidth / 3))
        ListView1.Columns.Add("Größe in GB", CInt(intWidth / 3))
        ListView1.Columns.Add("Freier Platz", CInt(intWidth / 3))

        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            With drive
                If .DriveType = IO.DriveType.Fixed Then ' nur Festplatte
                    objItem = ListView1.Items.Add(.RootDirectory.ToString)
                    With objItem
                        .SubItems.Add(Math.Round((((drive.TotalSize / 1024) / 1024) / 1024), 2).ToString + " GB")
                        .SubItems.Add(Math.Round((((drive.TotalFreeSpace / 1024) / 1024) / 1024), 2).ToString + " GB")
                        .ImageIndex = 0

                        If drive.TotalSize > drive.TotalFreeSpace * 10 Then
                            objItem.BackColor = Color.Red
                        End If
                    End With
                End If

            End With
        Next
    End Sub

    Private Sub mklink(ByVal newlink As String, ByVal src As String)

        Try ' mklink /J "Zielpfad" "Ausgangspfad"
            Shell("cmd /c " & Chr(34) & "mklink /J " + Chr(34) + newlink + Chr(34) + " " + Chr(34) + src + Chr(34) & Chr(34), AppWinStyle.MaximizedFocus, True, 5000)

            Dim process As New Process
            process.StartInfo.FileName = "cmd.exe"
            process.StartInfo.WorkingDirectory = "C:\"
            process.StartInfo.Arguments = "/c mklink /J " + Chr(34) + newlink + Chr(34) + " " + Chr(34) + src + Chr(34)
            process.Start()
        Catch ex As Exception       ' throw
            MsgBox(ex.Message)
        End Try

    End Sub

    Public Function GetSize(ByVal path As String) As Long
        Try
            Dim si As Long = 0
            Dim di As New IO.DirectoryInfo(path)
            For Each file As IO.FileInfo In di.GetFiles
                si += file.Length
            Next
            For Each dire As IO.DirectoryInfo In di.GetDirectories
                GetSize(dire.FullName)
            Next
            Return si
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return Nothing
        End Try
    End Function

    Public Function RunningApps(ByVal path As String) As List(Of String)
        Dim exelist As New List(Of String)
        Dim runningAppsList As New List(Of String)

        exelist = Directory.GetFiles(path, "*.exe", SearchOption.AllDirectories).ToList


        For Each exe In exelist
            exe = System.IO.Path.GetFileName(exe)
            exe = exe.Replace(".exe", "")
            Dim process As Process() = System.Diagnostics.Process.GetProcessesByName(exe)
            For Each proc As Process In process
                runningAppsList.Add(proc.ProcessName)
            Next
        Next

        Return runningAppsList
    End Function

#End Region

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
   
        Dim Result&
        Result = ShellExecute(0, "Open", _
                   "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KB8ENQH3QDPEJ", "", "", 1)
    End Sub

    
    Private Sub Button30_Click(sender As Object, e As EventArgs) Handles Button30.Click
        ListView1.Clear()
        DrivesToListView()
    End Sub
End Class
